<html>
<script>

    // 对象序列化是将对象的状态转换为字符串
    // 例子
    // o = { x: 1, y: { z: [false, null, ""] } };    // 定义一个测试对象
    // o = { x: 1, y: { z: [false, null, ""] } };    // 定义一个测试对象
    // console.log(o);
    // s = JSON.stringify(o);              // S是 '{x:1,y:{z:[false,null,""]}}' 
    // console.log(s);
    // p = JSON.parse(s);                  // p是o的深拷贝
    // console.log(p);

    // 请记住，数组是对象的特殊形式

    // o = {};
    // o[1] = "one";
    // console.log(o); 

    // 注意，当在数组直接量中省略值时不会创建稀疏数组
    // var a1 = [,,,];
    // console.log(a1.toString());        // 数组是[undefined,undefined,undefined];
    // a1[0] = "1";
    // // a1[1] = "2";
    // // a1[2] = "3";
    // console.log(a1);

    // for (var i = 0; i < a1.length; i++) {

    //     console.log(a1[i]);

    // }
    // var a2 = new Array(3);  // 该数组根本没有元素
    // console.log(0 in a1);   // =>: true a1在索引0处有一个元素
    // console.log(0 in a2);   // =>: false a2在索引0处没有元素         

    // 当使用for/in循环时，a1和a2之间的区别也很明显

    // ECMAScript5中，可以用Object.defineProperty()让数组的length属性变成只读的

    // a = [1,2,3];
    // Object.defineProperty(a, "length",
    //                         {writable:false});

    // a.length = 0;
    // console.log(a.length);
    // // 注意，对一个数组元素使用delete不会修改数组的length属性。


    // 数组遍历
    var o = { name: "张三", age: 25, address: "深圳", getName: function () { } }
    var keys = Object.keys(o);
    // 详解Object.keys(obj);
    // 参数：要返回其枚举自身属性的对象

    // 返回值: 一个给定对象的所有可枚举属性的字符串数组

    var values = [];
    for (var i = 0; i < keys.length; i++) {
        var key = keys[i];                      // 获得索引处的键值
        values[i] = keys[i];                    // 在values数组中保存属性值
    }
    console.log(values);

    // 优化遍历数组
    for (let i = 0; i < a.length; i++) {
        if (!a[i]) continue;                    // 跳过null、underfined和不存在的元素
    }



</script>



<head>
    <title>放置文章标题</title>
</head>

<body>

</body>

</html>